/**
 * 新增修改完成调用 modalFormOk方法 编辑弹框组件ref定义为modalForm
 * 高级查询按钮调用 superQuery方法  高级查询组件ref定义为superQueryModal
 * data中url定义 list为查询列表  delete为删除单条记录  deleteBatch为批量删除
 */
import { filterObj, formatDate } from '@/utils/util';
import { deleteAction, getAction, postAction, downFile, postDownFile, httpAction } from '@/api/manage'
import Vue from 'vue'
import { ACCESS_TOKEN, TENANT_ID } from "@/store/mutation-types"

export const JeecgListMixin = {
    data() {
        return {
            /* 查询条件-请不要在queryParam中声明非字符串值的属性 */
            queryParam: {},
            /* 数据源 */
            dataSource: [],
            /* 分页参数 */
            ipagination: {
                current: 1,
                pageSize: 20,
                pageSizeOptions: ['20', '50', '100'],
                showTotal: (total, range) => {
                    return range[0] + "-" + range[1] + " 共" + total + "条"
                },
                showQuickJumper: true,
                showSizeChanger: true,
                total: 0
            },
            /* 排序参数 */
            isorter: {
                column: '',
                order: '',
            },
            /* 筛选参数 */
            filters: {},
            /* table加载状态 */
            loading: false,
            /* table选中keys*/
            selectedRowKeys: [],
            /* table选中records*/
            selectionRows: [],
            /* 查询折叠 */
            toggleSearchStatus: false,
            //主键id
            rowKey: 'id',
            //业务类型存放导出redisKey
            busType: '',
            isSelectAll: false,
            selectedAllRows: [],
            permissions: [],
            myPermission: '/upms/user/getAllPermissionValues',
            listMethod: 'post'


        }
    },
    created() {
        if (!this.disableMixinCreated) {
            console.log(' -- mixin created -- ')
            this.loadData();
            this.initPermissions();
        }
    },
    computed: {
        //token header
        tokenHeader() {
            let head = { 'X-Access-Token': Vue.ls.get(ACCESS_TOKEN) }
            let tenantid = Vue.ls.get(TENANT_ID)
            if (tenantid) {
                head['tenant-id'] = tenantid
            }
            return head;
        }
    },
    methods: {
        loadData(arg) {
            if (!this.url.list) {
                //this.$message.error("请设置url.list属性!")
                return
            }
            //加载数据 若传入参数1则加载第一页的内容
            if (arg === 1) {
                this.ipagination.current = 1;
            }
            var params = this.getQueryParams(); //查询条件
            this.loading = true;
            httpAction(this.url.list, params, this.listMethod).then((res) => {
                if (res.success) {
                    this.selectedRowKeys = [];
                    this.selectionRows = [];
                    this.isSelectAll = false;
                    //update-begin---author:zhangyafei    Date:20201118  for：适配不分页的数据列表------------
                    this.dataSource = res.result.records || res.result;
                    if (res.result.total) {
                        this.ipagination.total = res.result.total;
                        
                        if (this.url.list == '/projectBuild/maSummaryOne') {
                            this.rowSpan('twoTypeName')
                        }
                        
                        if (this.url.list == '/projectBuild/maSummaryTwo') {
                            this.rowSpan('mainDeptName')
                        }
                    } else {
                        this.ipagination.total = 0;
                    }
                    //update-end---author:zhangyafei    Date:20201118  for：适配不分页的数据列表------------
                } else {
                    //this.$message.warning(res.message)
                    console.log(res.message)
                }
                this.loading = false;
            })
        },
        getQueryParams() {
            //获取查询条件
            var param = JSON.parse( JSON.stringify(this.queryParam||{}) );
            console.log(param)
            param.pageNo = this.ipagination.current;
            param.pageSize = this.ipagination.pageSize;
            param.busType = this.busType;
            param.rowKey = this.rowKey;
            param.isorter = this.isorter;
            param = Object.assign(param,param.isorter)
            if(this.customParam &&  this.customParam.constructor === Object) {
              param = Object.assign(param,this.customParam)
            } 
            return filterObj(param);
        },
        onSelectChange(selectedRowKeys, selectionRows) {
            this.selectedRowKeys = selectedRowKeys;
            this.selectionRows = selectionRows;
            if (this.selectedAllRows.length > this.selectionRows.length && this.selectionRows.length > 0) {
                this.isSelectAll = false
            }
        },
        onClearSelected() {
            this.selectedRowKeys = [];
            this.selectionRows = [];
        },
        searchQuery() {
            this.loadData(1);
        },
        superQuery() {
            this.$refs.superQueryModal.show();
        },
        searchReset() {
            this.queryParam = {}
            this.loadData(1);
        },
        batchDel: function() {
            if (!this.url.deleteBatch) {
                this.$message.error("请设置url.deleteBatch属性!")
                return
            }
            if (this.selectedRowKeys.length <= 0) {
                this.$message.warning('请选择一条记录！');
                return;
            } else {
                var ids = "";
                for (var a = 0; a < this.selectedRowKeys.length; a++) {
                    ids += this.selectedRowKeys[a] + ",";
                }
                var that = this;
                this.$confirm({
                    title: "确认删除",
                    content: "是否删除选中数据?",
                    onOk: function() {
                        that.loading = true;
                        deleteAction(that.url.deleteBatch, { ids: ids }).then((res) => {
                            if (res.success) {
                                //重新计算分页问题
                                that.reCalculatePage(that.selectedRowKeys.length)
                                that.$message.success(res.message);
                                that.loadData();
                                that.onClearSelected();
                            } else {
                                that.$message.warning(res.message);
                            }
                        }).finally(() => {
                            that.loading = false;
                        });
                    }
                });
            }
        },
        handleDelete: function(id) {
            if (!this.url.delete) {
                this.$message.error("请设置url.delete属性!")
                return
            }
            var that = this;
            deleteAction(that.url.delete, { id: id }).then((res) => {
                if (res.success) {
                    //重新计算分页问题
                    that.reCalculatePage(1)
                    that.$message.success(res.message);
                    that.loadData();
                } else {
                    that.$message.warning(res.message);
                }
            });
        },
        reCalculatePage(count) {
            //总数量-count
            let total = this.ipagination.total - count;
            //获取删除后的分页数
            let currentIndex = Math.ceil(total / this.ipagination.pageSize);
            //删除后的分页数<所在当前页
            if (currentIndex < this.ipagination.current) {
                this.ipagination.current = currentIndex;
            }
            console.log('currentIndex', currentIndex)
        },
        handleEdit: function(record) {
            this.$refs.modalForm.edit(record);
            this.$refs.modalForm.title = "编辑";
            this.$refs.modalForm.disableSubmit = false;
        },
        handleAdd: function() {
            this.$refs.modalForm.add();
            this.$refs.modalForm.title = "新增";
            this.$refs.modalForm.disableSubmit = false;
        },
        handleTableChange(pagination, filters, sorter) {
            //分页、排序、筛选变化时触发
            //TODO 筛选
            console.log(pagination)
            if (Object.keys(sorter).length > 0) {
                this.isorter.column = sorter.field;
                this.isorter.order = "ascend" == sorter.order ? "asc" : "desc"
            }
            this.ipagination = pagination;
            this.loadData();
        },
        handleToggleSearch() {
            this.toggleSearchStatus = !this.toggleSearchStatus;
        },
        // 给popup查询使用(查询区域不支持回填多个字段，限制只返回一个字段)
        getPopupField(fields) {
            return fields.split(',')[0]
        },
        modalFormOk() {
            // 新增/修改 成功时，重载列表
            this.loadData();
            //清空列表选中
            this.onClearSelected()
        },
        handleDetail: function(record) {
            this.$refs.modalForm.edit(record);
            this.$refs.modalForm.title = "详情";
            this.$refs.modalForm.disableSubmit = true;
        },
        onSelectAll(selected, selectedRows, changeRows) {
            //手动触发全选反选判断
            this.isSelectAll = selected
            this.selectedAllRows = selectedRows
        },
        /* 导出 */
        handlePostExportXls(fileName) {
            if (!fileName || typeof fileName != "string") {
                fileName = "导出文件"
            }
            let dateStr = formatDate(new Date().getTime(), 'yyyy-MM-dd')
            fileName = `${dateStr}《${fileName}》`
            var params = this.getQueryParams(); //查询条件

            params['rowKey'] = this.rowKey
            if (!this.isSelectAll && this.selectedRowKeys.length > 0) {
                params['selections'] = this.selectedRowKeys.join(",")
            } else {
                params['selections'] = ''
            }
            this.loading = true;
            postDownFile(this.url.exportXlsUrl, params).then((data) => {
                this.loading = false;
                if (!data) {
                    this.$message.warning("文件下载失败")
                    return
                }
                if (typeof window.navigator.msSaveBlob !== 'undefined') {
                    window.navigator.msSaveBlob(new Blob([data], { type: 'application/vnd.ms-excel' }), fileName + '.xls')
                } else {
                    let url = window.URL.createObjectURL(new Blob([data], { type: 'application/vnd.ms-excel' }))
                    let link = document.createElement('a')
                    link.style.display = 'none'
                    link.href = url
                    link.setAttribute('download', fileName + '.xls')
                    document.body.appendChild(link)
                    link.click()
                    document.body.removeChild(link); //下载完成移除元素
                    window.URL.revokeObjectURL(url); //释放掉blob对象
                }
            })
        },
        handleGetExportXls(fileName) {
            if (!fileName || typeof fileName != "string") {
                fileName = "导出文件"
            }
            let param = this.getQueryParams();
            if (this.selectedRowKeys && this.selectedRowKeys.length > 0) {
                param['selections'] = this.selectedRowKeys.join(",")
            }
            console.log("导出参数", param)
            downFile(this.url.exportXlsUrl, param).then((data) => {
                if (!data) {
                    this.$message.warning("文件下载失败")
                    return
                }
                if (typeof window.navigator.msSaveBlob !== 'undefined') {
                    window.navigator.msSaveBlob(new Blob([data], { type: 'application/vnd.ms-excel' }), fileName + '.xls')
                } else {
                    let url = window.URL.createObjectURL(new Blob([data], { type: 'application/vnd.ms-excel' }))
                    let link = document.createElement('a')
                    link.style.display = 'none'
                    link.href = url
                    link.setAttribute('download', fileName + '.xls')
                    document.body.appendChild(link)
                    link.click()
                    document.body.removeChild(link); //下载完成移除元素
                    window.URL.revokeObjectURL(url); //释放掉blob对象
                }
            })
        },
        initPermissions() {
            getAction(this.myPermission, { projectId: -1 }).then((res) => {
                if (res.code == 200) {
                    this.permissions = res.result
                } else {
                    this.$message.warning('加载权限数据失败:' + res.message)
                }
            })
        },
        rowSpan(key) {
            let arr = this.dataSource
              .reduce((result, item) => {
                if (result.indexOf(item[key]) < 0) {
                  result.push(item[key])
                }
                return result
              }, [])
              .reduce((result, keys) => {
                const children = this.dataSource.filter((item) => item[key] === keys)
                result = result.concat(
                  children.map((item, index) => ({ ...item, [`${key}RowSpan`]: index === 0 ? children.length : 0 }))
                )
                return result
              }, [])
            this.dataSource = arr
        },
        changeForceUpdate() { 
            this.$forceUpdate(); 
        }

    
    }

}